Os Dados

file_extension: A extensão do arquivo.
data %>% select(file_extension) %>% unique
## # A tibble: 42 x 1
##    file_extension
##    <chr>         
##  1 md            
##  2 js            
##  3 json          
##  4 html          
##  5 py            
##  6 java          
##  7 css           
##  8 xml           
##  9 txt           
## 10 yml           
## # ... with 32 more rows

Como é possível ver no resumo acima, temos extensões para scripts, imagens, textos, etc.

month_day, the_month, the_year: Dia, mês e ano respectivamente em que a coleta dos dados foi efetuada.
data %>% select(-file_extension, -users) %>% summary()
##    month_day       the_month         the_year   
##  Min.   : 1.00   Min.   : 1.000   Min.   :2016  
##  1st Qu.: 8.00   1st Qu.: 3.000   1st Qu.:2016  
##  Median :15.00   Median : 4.000   Median :2016  
##  Mean   :15.49   Mean   : 5.427   Mean   :2016  
##  3rd Qu.:23.00   3rd Qu.: 8.000   3rd Qu.:2017  
##  Max.   :31.00   Max.   :12.000   Max.   :2017

Temos dados desde 2016 até 2017, como falado anteriormente.

users: Quantidade de usuários que modificaram aquele tipo de arquivo até a data da coleta.
data %>% select(users) %>% summary()
##      users      
##  Min.   :  501  
##  1st Qu.:  763  
##  Median : 1520  
##  Mean   : 2151  
##  3rd Qu.: 2782  
##  Max.   :10279

Como possível visualizar acima, temos tipos de arquivos que tiveram 501 usuários mas também temos outros que tiveram 10279 usuários.

Filtrando…

Como temos 42 tipos de arquivos diferentes, iremos selecionar apenas 2 para a nossa análise, que serão js (JavaScript) e py (Python).

languages <- data %>%
              filter(file_extension %in% c("py","js"))

Trabalhando nos dados

Para a nossa análise teremos que ter duas novas variáveis, que são popularity e is_weekend, que irão descrever quão popular é um arquivo e se a data da coleta corresponde a um fim de semana, respectivamente.

Popularity

Para popularidade não teremos tanto trabalho, iremos adotar a popularidade como sendo a mediana de usuários que contribuíram. Ou seja, quanto maior a média, mais popular é aquela linguagem.

Is Weekend

A partir das variáveis month_day, the_month e the_year iremos descobrir se a data se refere a um fim de semana ou não.

Para isso, utilizaremos as bibliotecas lubridate e timeDate.

languages %>%
  mutate(cronology = lubridate::ymd(paste(the_year,
                         the_month,
                         month_day)),
         is_weekend = timeDate::isWeekend(cronology)) -> languages

languages %>%
  sample_n(10)
## # A tibble: 10 x 7
##    file_extension month_day the_month the_year users cronology  is_weekend
##    <chr>              <int>     <int>    <int> <int> <date>     <lgl>     
##  1 py                    24         1     2017  4831 2017-01-24 FALSE     
##  2 py                     4         1     2016  4127 2016-01-04 FALSE     
##  3 js                    19         3     2017  4613 2017-03-19 TRUE      
##  4 py                    31         5     2016  4965 2016-05-31 FALSE     
##  5 js                    28         1     2016  8118 2016-01-28 FALSE     
##  6 py                    11         8     2016  4505 2016-08-11 FALSE     
##  7 py                    21         3     2017  4957 2017-03-21 FALSE     
##  8 js                    19         2     2016  7917 2016-02-19 FALSE     
##  9 js                     7         5     2016  4444 2016-05-07 TRUE      
## 10 js                     2         8     2016  5960 2016-08-02 FALSE

Como se comportam as linguagens em termos de Popularidade?

languages %>%
  group_by(file_extension, is_weekend) %>%
  summarise(popularity = median(users)) %>%
  ggplot(aes(
    x = reorder(file_extension, popularity),
    y = popularity,
    fill = is_weekend)) + 
  geom_bar(stat = "identity") + 
  labs(x = "File extension", y = "Popularity") -> p

ggplotly(p)

Na visualização acima conseguimos perceber que JavaScript apresenta uma popularidade maior tanto nos dias de semana como nos finais de semana em relação a Python.

Como se comportam as alterações em uma linguagem de programação durante o tempo?

languages %>% 
  ggplot(aes(
      x = cronology,
      y = users,
      color = is_weekend)) +
    geom_point() +
    facet_wrap(~file_extension) +
    labs(x = "Cronology", y = "Users") -> p

ggplotly(p)

Como é possível ver, ambas as linguagens possuem um comportamento semelhate, um crescimento rápido depois uma queda, mais uma subida e por fim uma queda nas edições dos ultimos meses.

Uma coisa bastante interessante é perceber que as alterações tanto em Python como em JavaScript apresentam um comportamento bastante semelhante quando feitas em finais de semana ou não.

Será que as linguagens possuem uma diferença significativa na popularidade durante a semana e o fim de semana?

Para isso, iremos analisar as linguagens separadamente…

JavaScript

languages %>%
  filter(file_extension == "js") %>%
  ggplot(aes(
    x = is_weekend, 
    y = users,
    group = is_weekend, 
    fill = is_weekend)) + 
  geom_boxplot() +
  labs(y = "Number of editing users") +
  ggtitle("JavaScript popularity (weekdays vs weekend)") +
  theme(axis.title.x = element_blank(),
        axis.text.x = element_blank(),
        axis.ticks.x = element_blank()) -> p

ggplotly(p)

Com a visualização, podemos entender que os desenvolvedores JavaScript costumam trabalhar durante a semana.

Como se trata de uma amostra e com alguns dados faltantes, não podemos concluir com tanta confiança.

Para isso, iremos utilizar a técnica de Bootstrapping para nos ajudar com a diferença não pareada entre a popularidade durante a semana e no fim de semana.

Bootstrapping - JavaScript

languages %>%
  filter(file_extension == "js") -> js

b.diff.means <- bootstrap2(js$users, 
                          treatment = js$is_weekend, 
                          median, R = 10000)

means.diff = CI.percentile(b.diff.means, probs = c(.025, .975))
means.diff
##                    2.5% 97.5%
## median: FALSE-TRUE 2679  3051
data.frame(means.diff) %>%
  ggplot(aes(
    x = "Difference",
    ymin = X2.5., 
    ymax = X97.5.)) +
  geom_errorbar(width = .2) +
  geom_hline(yintercept = 0, colour = "red") +
  labs(x = "")

O C.I. nos mostra que JavaScript é bem mais popular durante a semana, pois o intervalo é bem acima de 0. Isso de fato era esperado, dado as visualizações anteriores e também (intuitivamente) as empresas que utilizam JavaScript geralmente tem o seu ciclo de trabalho apenas durante a semana.

Portanto, podemos afirmar com 95% de confiança que JavaScript é mais popular durante a semana, dado que o intervalo de confiança da diferença não pareada para popularidade na semana e no fim de semana não passa pelo eixo y = 0.

Python

languages %>%
  filter(file_extension == "py") %>%
  ggplot(aes(
    x = is_weekend, 
    y = users,
    group = is_weekend, 
    fill = is_weekend)) + 
  geom_boxplot() +
  labs(y = "Number of editing users") +
  ggtitle("Python popularity (weekdays vs weekend)") +
  theme(axis.title.x = element_blank(),
        axis.text.x = element_blank(),
        axis.ticks.x = element_blank()) -> p

ggplotly(p)

Com a visualização, podemos entender que os desenvolvedores Python também costumam trabalhar bem mais durante a semana.

Bootstrapping - Python

languages %>%
  filter(file_extension == "py") -> py

b.diff.means <- bootstrap2(py$users, 
                          treatment = py$is_weekend, 
                          median, R = 10000)

means.diff = CI.percentile(b.diff.means, probs = c(.025, .975))
means.diff
##                      2.5%  97.5%
## median: FALSE-TRUE 2062.5 2234.5
data.frame(means.diff) %>%
  ggplot(aes(
    x = "Difference",
    ymin = X2.5., 
    ymax = X97.5.)) +
  geom_errorbar(width = .2) +
  geom_hline(yintercept = 0, colour = "cyan") +
  labs(x = "")

O C.I. nos mostra que Python também é bem mais popular durante a semana, pois o intervalo é bem acima de 0. Isso de fato também era esperado.

Portanto, de forma semelhante, podemos afirmar com 95% de confiança que Python é mais popular durante a semana, dado que o intervalo de confiança da diferença não pareada para popularidade na semana e no fim de semana não passa pelo eixo y = 0.

Existe uma diferença significativa entre a popularidade das duas linguagens nos fins de semana?

languages %>% 
  filter(is_weekend) %>%
  ggplot(aes(
    x = file_extension, 
    y = users,
    group = file_extension, 
    fill = file_extension)) + 
  geom_boxplot() +
  ggtitle("Python vs JavaScript (Weekends)") +
    theme(axis.title.x = element_blank(),
        axis.text.x = element_blank(),
        axis.ticks.x = element_blank()) +
  labs(y = "Number of users editing files")

Dada a visualização acima, podemos ver que JavaScript é bem mais popular que Python.

Utilizando a mesma técnica para Bootstrapping

Bootstrapping

languages %>%
  filter(is_weekend) -> weekend

b.diff.means <- bootstrap2(weekend$users, 
                          treatment = weekend$file_extension, 
                          median, R = 10000)

means.diff = CI.percentile(b.diff.means, probs = c(.025, .975))
means.diff
##                   2.5% 97.5%
## median: js-py 1574.671  1886
data.frame(means.diff) %>%
  ggplot(aes(
    x = "Difference",
    ymin = X2.5., 
    ymax = X97.5.)) +
  geom_errorbar(width = .2) +
  geom_hline(yintercept = 0, colour = "brown") +
  labs(x = "")

A diferença entre a popularidade existe sim. Podemos concluir que JavaScript é mais popular em finais de semana em relação a Python, como também pudemos perceber nas demais visualizações acima.

Portanto, observando os intervalos de confiança para as diferenças não pareadas entre JavaScript e Python durante os finais de semana, podemos dizer com um grau de confiança de 95% que JavaScript é significativamente mais popular que Python nos fins de semana.